package com.example.java.utils;

import java.util.List;
import java.util.stream.Collectors;

public class StringMethodExample {

    static void main(String[] args) {
        String str = "   Hello Java世界!   ";

        // 1. length() - 获取字符串长度
        System.out.println(STR."字符串长度：\{str.length()}"); // 17（包含空格）

        // 2. charAt(index) - 获取指定索引的字符（从0开始）
        char ch = str.charAt(6);
        System.out.println("第7个字符是：" + ch); // 'J'

        // 3. indexOf / lastIndexOf - 查找字符或子串位置
        int firstSpace = str.indexOf(' ');     // 第一个空格位置
        int lastSpace = str.lastIndexOf(' ');  // 最后一个空格位置
        System.out.println("首个空格位置：" + firstSpace);   // 0
        System.out.println("末尾空格位置：" + lastSpace);    // 16

        int javaIndex = str.indexOf("Java");
        System.out.println("子串 'Java' 起始位置：" + javaIndex); // 4

        // 4. substring(begin, end) - 截取子串 [begin, end)
        String sub1 = str.substring(4, 8);
        System.out.println("截取 'Java'：" + sub1); // "Java"

        // 5. trim() vs strip() - 去除首尾空白
        // trim(): 只去除 ASCII 空白（空格、制表符、换行）
        // strip(): 支持 Unicode 空白（如全角空格），更安全（JDK 11+）
        String trimmed = str.trim();
        String stripped = str.strip();
        System.out.println("trim 后：" + "'" + trimmed + "'");   // 'Hello Java世界!'
        System.out.println("strip 后：" + "'" + stripped + "'"); // 'Hello Java世界!'

        // stripLeading() / stripTrailing() - 只去头或尾
        System.out.println("只去头部空白：" + str.stripLeading()); // "Hello Java世界!   "
        System.out.println("只去尾部空白：" + str.stripTrailing()); // "   Hello Java世界!"

        // 6. toUpperCase / toLowerCase - 转换大小写
        System.out.println("大写：" + str.strip().toUpperCase()); // HELLO JAVA世界!
        System.out.println("小写：" + str.strip().toLowerCase()); // hello java世界!

        // 7. equals / equalsIgnoreCase - 比较字符串
        String str2 = "hello java世界!";
        System.out.println("严格相等？" + str.strip().equals(str2));           // false（大小写不同）
        System.out.println("忽略大小写相等？" + str.strip().equalsIgnoreCase(str2)); // true

        // 8. startsWith / endsWith - 判断前缀或后缀
        System.out.println("以 'Hello' 开头？" + str.strip().startsWith("Hello")); // true
        System.out.println("以 '!' 结尾？" + str.strip().endsWith("!"));           // true

        // 9. contains - 是否包含某子串
        System.out.println("包含 'Java'？" + str.contains("Java")); // true
        System.out.println("包含 'Python'？" + str.contains("Python")); // false

        // 10. replace / replaceAll / replaceFirst - 替换内容
        String replaced1 = str.replace(" ", "-");  // 替换所有空格
        System.out.println("替换空格为-：" + replaced1); // "---Hello-Java世界!---"

        String replaced2 = str.replaceAll("\\s+", "_"); // 正则：多个空白替换为单个下划线
        System.out.println("正则替换空白：" + replaced2); // "_Hello_Java世界!_"

        String replaced3 = str.replaceFirst("\\s+", "_"); // 只替换第一个空白块
        System.out.println("仅替换首个空白：" + replaced3); // "_Hello Java世界!   "

        // 11. split(regex) - 按正则分割
        String data = "apple,banana,orange";
        String[] fruits = data.split(",");
        System.out.println("分割结果：" + String.join(" | ", fruits)); // apple | banana | orange

        // 分割并过滤空字符串
        String messy = "a,  b, , c";
        String[] clean = messy.split(",");
        List<String> filtered = java.util.Arrays.stream(clean)
                .map(String::strip)          // 去空白
                .filter(s -> !s.isEmpty())   // 去空
                .collect(Collectors.toList());
        System.out.println("清理后分割：" + filtered); // [a, b, c]

        // 12. join(delimiter, elements) - 拼接字符串
        String joined = String.join("-", "2025", "04", "05");
        System.out.println("拼接日期：" + joined); // 2025-04-05

        // 13. isEmpty / isBlank - 判断空字符串
        System.out.println("空字符串 isEmpty? " + "".isEmpty());     // true
        System.out.println("空字符串 isBlank? " + "".isBlank());     // true

        System.out.println("全空格字符串 isBlank? " + "   ".isBlank()); // true（JDK 11+ 推荐）
        System.out.println("全空格字符串 isEmpty? " + "   ".isEmpty()); // false

        // 14. repeat(n) - 重复字符串 n 次（JDK 11+）
        String line = "-".repeat(20);
        System.out.println("分隔线：" + line); // -------------------- 

        // 15. lines() - 按行分割为 Stream（JDK 11+）
        String multiLine = "第一行\n第二行\r\n第三行";
        System.out.println("按行输出：");
        multiLine.lines().forEach(lineContent -> 
            System.out.println("→ " + lineContent)
        );
        // 输出：
        // → 第一行
        // → 第二行
        // → 第三行

        // 16. formatted(...) - 格式化字符串（JDK 15+，替代 String.format）
        String name = "小明";
        int age = 18;
        String info = "姓名：%s，年龄：%d".formatted(name, age);
        System.out.println("格式化结果：" + info); // 姓名：小明，年龄：18

        // 17. transform(Function) - 函数式转换（JDK 12+）
        String result = "  hello  "
                .transform(String::strip)           // 去空白
                .transform(s -> s.substring(0, 1).toUpperCase() + s.substring(1)) // 首字母大写
                .transform(s -> s + "!");
        System.out.println("链式转换结果：" + result); // Hello!

        // 18. valueOf() - 将其他类型转为字符串（静态方法）
        String numStr = String.valueOf(123);
        String boolStr = String.valueOf(true);
        System.out.println("数字转字符串：" + numStr);   // 123
        System.out.println("布尔转字符串：" + boolStr);  // true
    }
}